package com.gzyz.drug.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gzyz.drug.entity.NocvData;
import com.gzyz.drug.service.IndexService;
import com.gzyz.drug.vo.DataView;
import com.gzyz.drug.vo.NocvDataVo;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFShape;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.IIOParam;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ChinaDataAdminController {
    @Autowired
    private IndexService indexService;


    //跳转页面
/*    @RequestMapping("/toChinaManager")

    public String toChinaData() {
        return "/chinadatamanager";
    }*/


    /**
     * 模糊查询，带有分页
     *
     * @return
     */
    @GetMapping("/listDataByPage")
    public DataView listDataByPage(NocvDataVo nocvDataVo) {

        //1.创建分页的对象(当前页，每页限制大小)
        IPage<NocvData> page = new Page<>(nocvDataVo.getPage(), nocvDataVo.getLimit());
        //2.创建模糊查询条件
        QueryWrapper<NocvData> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(!(nocvDataVo.getName()==null), "name", nocvDataVo.getName());
        //3.疫情数据确诊最多的排在最上面
        queryWrapper.orderByDesc("value");
        //4.查询数据库
        indexService.page(page, queryWrapper);
        //5.返回数据封装
        DataView dataView = new DataView(page.getTotal(), page.getRecords());
        dataView.setCode(0);
        return dataView;
    }

    /**
     * 删除数据根据id
     * @param id
     * @return
     */
    @DeleteMapping("/china/deleteById")
    public DataView deleteById(Integer id){
        indexService.removeById(id);
        DataView dataView = new DataView();
        dataView.setCode(200);
        dataView.setMsg("删除中国地图数据成功！");
        return dataView;
    }

    /**
     * 新增或者修改【id】
     * id：nocvData 有值修改，没有值就是新增
     * update nocvdata set name = "" where id = ?
     * insert into
     * @param nocvData
     * @return
     */
    @PostMapping ("/china/addOrUpdateChina")
    public DataView addChina(NocvData nocvData){
        boolean save = indexService.saveOrUpdate(nocvData);
        DataView dataView = new DataView();
        if (save){
            dataView.setCode(200);
            dataView.setMsg("新增或修改中国地图数据成功！");
            return dataView;
        }
        dataView.setCode(100);
        dataView.setMsg("新增或修改中国地图数据失败！");
        return dataView;
    }

    /**
     * Excel的拖拽及点击上传
     * 1.前台页面发送一个请求，上传文件MultiPartFile Http
     * 2.Controller ，上传文件MultiPartFile  参数
     * 3.POI解析文件，里面的数据一行一行全部解析出来
     * 4.每一条数据插入数据库
     */
    @RequestMapping("/excelImportChina")
    public DataView excelImportChina(@RequestParam("file")MultipartFile file) throws Exception {
        DataView dataView = new DataView();
        //1.文件上传不能为空
        if (file.isEmpty()) {
            dataView.setMsg("文件为空，不能上传!");
        }
        //2.POI获取excel解析数据
//        插入后缀名为.xls的表格
//        HSSFWorkbook wb = new HSSFWorkbook(file.getInputStream());//获取输入流
//        HSSFSheet sheet = wb.getSheetAt(0);//获取表格的开头
//        插入后缀名为.xlsx的表格
        XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());
        XSSFSheet sheet = wb.getSheetAt(0);


        //3.定义一个程序集合，接受文件中的数据
        List<NocvData> list = new ArrayList<>();//用一个集合来装表格
//        HSSFRow row = null;
        XSSFRow row = null;

        //4.解析数据，装到集合里面
        for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {//获取表格所有的数据并遍历
            //4.1  定义实体
            NocvData nocvData = new NocvData();
            //4.2  每一行的数据 放到实体类里面
            row = sheet.getRow(i);
            //4.3  解析数据
            nocvData.setName(row.getCell(0).getStringCellValue());//拿到城市名称
            nocvData.setValue((int) row.getCell(1).getNumericCellValue());//拿到数量

            //5.添加list集合
            list.add(nocvData);
        }

        //6.插入数据库
        indexService.saveBatch(list);
        dataView.setCode(200);
        dataView.setMsg("Excel已经插入成功！");
        return dataView;

    }


    /**
     * 导出excel数据 中国疫情数据
     * 1.查询数据库
     * 2.建立Excel对象  封装数据
     * 3.POI建立输出流  输出文件
     */
    @RequestMapping("/excelOutPortChina")
    public void excelOutPortChina(HttpServletResponse response) throws Exception {
        //1.查询数据库[查询所有，符合条件的数据给你查询到] 可以在查库的时候做约束，或者在list里面
        List<NocvData> list = indexService.list();
        //2.建立Excel对象 封装数据
        response.setCharacterEncoding("UTF-8");
        //2.1 创建Excel对象
        HSSFWorkbook wb = new HSSFWorkbook();
        //2.2  创建sheet对象
        HSSFSheet sheet = wb.createSheet("中国疫情数据sheet1");
        //2.3  创建表头
        HSSFRow hssfRow = sheet.createRow(0);
        hssfRow.createCell(0).setCellValue("城市名称");
        hssfRow.createCell(1).setCellValue("确诊数量");
        //3.遍历数据，封装Excel公共对象
        for (NocvData data : list) {
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
            dataRow.createCell(0).setCellValue(data.getName());
            dataRow.createCell(1).setCellValue(data.getValue());
        }
        //4.建立输出流，输出到浏览器文件
        OutputStream os = null;
        //4.1 设置一下excel名字(中国疫情数据表)   输出类型(.xls)和编码(iso-8859-1)
        response.setContentType("application/octet-stream;charset=utf8");
        response.setHeader("Content-Disposition","attachment;filename="+ new String("中国疫情数据表".getBytes(),"iso-8859-1")+".xls");
        //4.2输出文件
        os = response.getOutputStream();
        wb.write(os);
        os.flush();
        //5.  关闭输出流
        os.close();
    }

}
